
class Solution {
public:
    int ret = INT_MIN;
    int _maxPathSum(TreeNode* TreeNode)
    {
        if(TreeNode == nullptr)
        {
            return 0;
        }
        int leftsum = _maxPathSum(TreeNode->left);//计算左子树的最大路径和
        int rightsum = _maxPathSum(TreeNode->right);//计算右子树的最大路径和
        ret = max(ret,leftsum+rightsum+TreeNode->val);
        return max(leftsum>rightsum?(leftsum+TreeNode->val):(rightsum+TreeNode->val),0);
        //这里和0取了最大值，因为可能出现下面的情况
        //2
      //-1 首先对于根节点来说，再去计算左子节点的时候不和0进行判断，那么左子树计算出来的值就是-1，和我2相加
      //反而得不到最大值，所以对于每一层的节点来说，如果我这个节点和之前的路径和相加为负数，代表这一段一定不是最优鞥带选择
      //直接返回0即可
    }
    int maxPathSum(TreeNode* root) {
        //使用递归解决，对于每一个节点来说要做的事情，就是去计算我左子树的最大路径和，以及右子树的最大路径和，
        //并且将当前这个节点当作是转角节点也就是左子树的最大路径和一定会经过我的root节点，右子树也是一样的
        _maxPathSum(root);
        return ret;
    }
};